package com.globalresources.commons;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;


/**
 * 分页Bean，继承了JSP的BodyTagSupport。使用为四个过程：
 * 
 * 
 * 1。使用时要配合如下配制文件：
 * 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
	<tlib-version>1.1</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>p</short-name>	
	<tag>
		<name>pagination</name>
		<tag-class>cn.seekar.com.Pagination</tag-class>
		<body-content>jsp</body-content>
		<attribute>
			<name>pageIndex</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<type>int</type>
			<description>当前的页数</description>
		</attribute>
		<attribute>
			<name>pageCount</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<description>总页数</description>
		</attribute>
		<attribute>
			<name>actionName</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
			<description>action</description>
		</attribute>
		<attribute>
			<name>parameters</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
			<description>url自定义参数</description>
		</attribute>
	</tag>
</taglib>

 * 这里声明文件，要放在项目的WEB-INF/下，这里以pagination.tld为文件名。
 * 
 * 2。在页面要使用标签，写如下声明：
 * <%@ taglib prefix="p" uri="/WEB-INF/pagination.tld" %>
 * 
 * 3。在页面需要分布的位置写如下标签：
 * <p:pagination 
 * pageIndex="${pageIndex}" 
 * actionName="example.shtml?" 
 * pageCount="${pageCount}" 
 * parameters="a=${a}&b=${b}&">
 * </p:pagination>
 * 注意：经初步测试，这里需要EL表达式取出动态值，在Strut2中不能用OGNL表达式取出值。另注意Struts2.0.11不在支持EL表达式。
 * pageIndex是当前页；
 * actionName是请求的资源，可以是Jsp和Struts的action，注意在最后加"?"；
 * pageCount是总页面数；
 * parameters是参数,注意每个参数后加上"&"；
 * 上述四值要在action或servlet中的request域中赋值。其中parameters不是必需的。
 * 
 * 4。写分页函数：这是以在Struts2中的action中写法为例：
 * 		
 * 		HttpServletRequest request = ServletActionContext.getRequest() ;
		String pageIndex = request.getParameter("pageIndex");
		String parameters = request.getParameter("parameters") ;
		....
		request.setAttribute("pageIndex","1");
		request.setAttribute("pageCount","10");
		request.setAttribute("parameters","a＝1&b=2&");
		....
 *  具体参数的赋值视具体情况而定，这里只是举个赋值的例子，仅供参考。
 * 
 * 
 * @author <a href="mailto:neatchenheng@gmail.com">chenheng</a>
 * @version 0.1 2009.03.13
 *
 */
public class Pagination extends BodyTagSupport {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 总页面数
	 */
	private int pageCount;
	/**
	 * 当前所在页面
	 */
	private int pageIndex;
	/**
	 * 请求的资源
	 */
	private String actionName;
	/**
	 * 参数集
	 */
	private String parameters;
	/**
	 * 最后返回的串，包括分页显示的内容及相关的链接
	 */
	private String url;
	/**
	 * 将actionName 与 parameters联接构成
	 */
	private String paginationUrls;

	@Override
	public int doStartTag() throws JspException {
		paginationUrls = getActionName() + getParameters() ;
		StringBuffer stbf = new StringBuffer() ;
		//int pageFront = pageIndex - Constant.offset ;
		int pageBack = pageIndex + PaginationConstant.FOUR ;
		if ( pageIndex == 1) {
			stbf.append("首页");
			stbf.append("第一页") ;
		} else {
			stbf.append("<a href=" + paginationUrls + "pageIndex=1>首页</a>") ;
			stbf.append("<a href=" + paginationUrls + "pageIndex=" + (pageIndex -1) + ">上一页</a>") ;
		}
		if (pageIndex < PaginationConstant.FIVE) {
			if ( pageCount <= PaginationConstant.TEN ) {
				for (int i = 1 ; i <= pageCount ; i ++ ) {
					if ( i == pageIndex ) {
						stbf.append("[" + i + "]") ;
					} else {
						stbf.append("<a href=" + paginationUrls + "pageIndex=" + i + ">[" + i + "]</a>") ;
					}
				}
			} else {
				for (int i = 1 ; i < PaginationConstant.TEN ; i ++ ) {
					if ( i == pageIndex ) {
						stbf.append("[" + i + "]") ;
					} else {
						stbf.append("<a href=" + paginationUrls + "pageIndex=" + i + ">[" + i + "]</a>") ;
					}
				}
			}
		} else {
			for ( int i = PaginationConstant.FOUR ; i > 0 ; i --) {
				stbf.append("<a href=" + paginationUrls + "pageIndex=" + (pageIndex - i) + ">[" + (pageIndex - i) + "]</a>") ;
			}
			stbf.append("[" + pageIndex + "]") ;
			if ( pageBack <= pageCount ) {
				for ( int i = 1; i < PaginationConstant.FIVE ; i ++ ) {
					stbf.append("<a href=" + paginationUrls + "pageIndex=" + (pageIndex + i) + ">[" + (pageIndex + i) + "]</a>") ;
				}
			} else {
				for ( int i = 1 ; i <= pageCount - pageIndex ; i ++ ) {
					stbf.append("<a href=" + paginationUrls + "pageIndex=" + (pageIndex + i) + ">[" + (pageIndex + i) + "]</a>") ;
				}
			}
		}
		if ( pageIndex == pageCount || pageCount == 0 ) {
			stbf.append("下一页") ;
			stbf.append("最后一页") ;
		} else {
			stbf.append("<a href=" + paginationUrls + "pageIndex=" + (pageIndex + 1) + ">下一页</a>") ;
			stbf.append("<a href=" + paginationUrls + "pageIndex=" + pageCount + ">最后一页</a>") ;
		}
		JspWriter out = pageContext.getOut() ;
		try {
			out.println(stbf.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
		return EVAL_PAGE ;
	}

	public int getPageCount() {
		return pageCount;
	}

	public void setPageCount(int pageCount) {
		this.pageCount = pageCount;
	}

	public int getPageIndex() {
		return pageIndex;
	}

	public void setPageIndex(int pageIndex) {
		this.pageIndex = pageIndex;
	}

	public String getActionName() {
		return actionName;
	}

	/**
	 * 请注意在actionName的后面加上'?'
	 * 
	 * @param actionName
	 */
	public void setActionName(String actionName) {
		this.actionName = actionName;
	}

	public String getParameters() {
		return parameters;
	}

	/**
	 * 参数间用'&'分开
	 * 
	 * @param parameters
	 */
	public void setParameters(String parameters) {
		this.parameters = parameters;
	}

	public String getPaginationUrls() {
		return paginationUrls;
	}

	public void setPaginationUrls(String paginationUrls) {
		this.paginationUrls = paginationUrls;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

}
